# 列表的基本使用
"""
a = [10,20,"jiac","rbkst"]
b = [] # 创建了一个空列表
print(b)
print(a)
"""
# list()创建
"""
c = list() # 创建了一个空的列表
print(c)
c1 = list(range(10))
print(c1) # 0~9的列表
"""
# 推导式生成列表
"""
nums = [i for i in range(10)] # 生成了一个0~9的列表
print(nums)
"""
# 上面的推导式类似于下面的
"""
x = []
for i in range(10):
    #第一次循环：i是0
    #第二次循环：i是1
    # ...
    x.append(i)# [0,1,2,3,4,5,6,7,8,9]
print(x)
"""
"""
nums = [i for i in range(10) if i%2==0]
print(nums) # [0,2,4,6,8]
"""
"""
nums1 = [i for i in range(10) if i%2]
print(nums1)
"""
# 等同于下面
"""
x = []
for i in range(10):
    if i%2: # bool
        x.append(i)
print(x)
"""
"""
nums = [(x,y) for x in range(5,10) for y in range(10,20)]
print(nums)
"""
# 等同于下面
"""
x1 = []
for x in range(5,10):
    # 外层循环一次
    for y in range(10,20):
    # 里层循环10次，循环变量从10开始到19结束
        x1.append((x,y))
print(x1)
"""
# 列表推导式排序
ts_file = ['10.ts','9.ts','101.ts','5.ts']
# 1. 变成字符串的数字
"""
s1 = [i.replace('.ts','') for i in ts_file]
# 将.ts的字符串尾缀替换成空字符串。  2.ts --> 2
print(s1) #  ['2', '3', '4', '5']
"""
# 2. 变成整数
"""
s2 = [int(i.replace('.ts','')) for i in ts_file]
print(s2) # [2, 3, 4, 5]
"""
# 3. 对生产整数的列表进行排序
"""
print([int(i.replace('.ts','')) for i in ts_file]) # 没有排序的列表
s3 = sorted([int(i.replace('.ts','')) for i in ts_file]) # 排序列表，升序返回
print(s3)
"""
# 4. 变回字符串类型的数字并加上.ts
"""
s4 = [str(j) + '.ts' for j in sorted([int(i.replace(".ts",'')) for i in ts_file])] # [5,9,10,101]
print(s4) # ['5.ts', '9.ts', '10.ts', '101.ts']
"""
# 使用下标来获取列表元素
"""
索引概念和字符串、其他的有序数据结构都是一样的
从左面到右面，索引0开始
从右面到左面，索引-1开始
"""
a = [10,20,30,40,50,20,30,20,30]
# print(a[2]) # 30
# print(a[-1]) # 30
# print(a[20]) # IndexError: list index out of range
# index() 内置方法
"""
print(a.index(20)) # 1
print(a.index(20,3)) #  从索引3的位置往后搜索第一个20
"""
# 列表的增删改查
# append ： 列表末尾追加一个元素
"""
x = []
x.append(10)
print(x) # [10]
x1 = [10]
# 两个列表的值相同，但是地址值也不会一样，因为列表是可变的数据结构
print(id(x)) # 15189776
print(id(x1)) # 15188656
"""
# extend： 在列表的末尾追加另外一个列表的值。合并列表
"""
b = [10,20,30]
b1 = [11,21,31]
b.extend(b1)
print(b)# [10,20,30,11,21,31]
"""
# insert： 插入元素
"""
a3 = [10,20,30]
a3.insert(0,101) # index： 在哪个索引位置加，object：加的值是什么
print(a3)
"""
# 乘法扩展
"""
a4 = [10,20,30]
print(a4*3) # [10,20,30,10,20,30,10,20,30]
"""
# 列表删除
# a5 = [10,20,30]
"""
del a5[2]
print(a5) # [10,20]
"""
"""
result = a5.remove(10) # remove 返回值 是None
print(result) # 返回值是None
print(a5)
"""
"""
result = a5.pop(2) # 根据索引删除列表的元素
print(result) # 返回值 ： 具体删除的哪个元素
print(a5)
"""
# 列表修改
"""
a6 = [10,20,30]
a6[0] = 100 # 直接通过索引赋值就可以
print(a6) # [100,20,30]
"""
# 查看列表
a7 = [100,30,50,5,75,8,9,5,5,1,6514,55,7,2]
"""
print(a7.count(5)) # 统计5出现的次数
print(len(a7)) # 查看列表的长度
if 30 in a7:
    print("30在列表里")
"""
"""
print(max(a7)) # 6514
print(min(a7)) # 1
print(sum(a7)) # 6866
"""
# 列表的遍历
"""
for i in a7:
    print(i)
"""
# for 循环遍历
killers = ['李白','兰陵王','韩信','赵云','阿珂','孙悟空']
"""
for killer in killers:
    print(killer)
"""
# while 循环遍历
"""
i = 0
while i < len(killers):
    print(killers[i])
    i+=1
"""
#列表的排序和反序
"""
a8 = [20,10,30,40]
a8.sort()
print(a8) # [10, 20, 30, 40]
a8.sort(reverse=True) # reverse 为True  降序返回
print(a8) # [40, 30, 20, 10]
"""
# random随机数
"""
import random
random.shuffle(a8) # 捣乱列表顺序
print(a8)
ran_num = random.randint(1,100) #生成一个从1~100之间的随机数
print(ran_num)
"""
# sorted(list) 内置函数
# 排序不会改变原有的列表，会生成一个新的列表
"""
a7_new = sorted(a7,reverse=True)
print(a7_new) # [6514, 100, 75, 55, 50, 30, 9, 8, 7, 5, 5, 5, 2, 1]
a7_new1 = sorted(a7)
print(a7_new1)
"""
# 列表翻转函数
"""
a7.reverse()
print(a7)
print(a7[::-1]) # 它的作用域仅限于这一行，因为没有赋值变量
print(a7)
"""
# reversed() 返回迭代器
"""
a9 = [20,10,30,40]
c = reversed(a9)
print(c) # <list_reverseiterator object at 0x01CE57B0>，迭代器的地址值
print(list(c)) # [40, 30, 10, 20]
print(list(c)) # []
"""
"""
a = 12
b = a
a = 10
print(a) # 10
print(b) # 12
"""
"""
nums1 = [100,200,300]
nums2 = nums1
print(f"nums1列表 = {id(nums1)}，nums2列表 ={id(nums2)}")# 修改列表之前查看的地址值，没有变化
nums1[0] = 1 # nums1 列表内容发生改变
nums2[0] = 199 # nums2列表内容发生改变
print(f"修改完以后：nums1列表 = {id(nums1)}，nums2列表 ={id(nums2)}")
"""
# 列表的浅复制
x = [100,200,300]
"""
# x 和 y 指向同一个内存空间  会相互影响
y = x
b = x.copy() #根据x列表复制出来的一个列表
print(b) # [100,200,300]
x[0] = 1
print(y) # [1, 200, 300]
"""
"""
import copy
a10 = copy.copy(x) # [100,200,300]
print(id(a10))
print(id(x))

print(id(a10[0])) # 100
print(id(x[0]))# 100
"""
# 切片也属于浅拷贝
"""
names1 = ["张三","李四","王五","杰克"]
names2 = names1[::]
names1[0] = "jerry"
print(names2) # ['张三', '李四', '王五', '杰克']
print(id(names2))
print(id(names1)) # ['jerry', '李四', '王五', '杰克']
"""
"""
浅拷贝：拷贝出来的列表本身是开辟了一个新的物理空间地址，
但是列表元素内的值，和原来列表的值地址空间指向了同一处
"""
# 深拷贝和浅拷贝
"""
浅拷贝:不拷贝对象的内容,只是拷贝子对象的引用

比如: 爷爷 儿子 孙子 只会拷贝爷爷并不会拷贝儿子 和孙子(拷贝个体)
"""
import copy
#  浅复制(拷贝)

nums = [1,2,3,4,5]

nums1 = nums # 深拷贝？ 浅拷贝？ 都不是 是一个赋值

nums2 = nums.copy() # 浅拷贝，两个内容一摸一样 但是 不是同一个对象

nums3 = copy.copy(nums) # 和nums.copy() 功能一致  都是浅拷贝

#  深拷贝，只能使用copy模块实现
words = ['hello','good',[100,200,300],'yes','hi','ok']

words1 = words.copy()
words[0] = "你好"
# words1是不变的
# print(words1)
# 原列表发生了改变
# print(words)

# 修改words下标2的元素
# words[2][0] = 1
# print(words1) # ['hello', 'good', [1, 200, 300], 'yes', 'hi', 'ok']
# 浅拷贝只拷贝了一层，对于二维列表、多维列表仍然会有改变

# 深拷贝
words2 = copy.deepcopy(words)
words[2][0] = 1
print(words) #  ['你好', 'good', [1, 200, 300], 'yes', 'hi', 'ok']
print(words2) # ['你好', 'good', [100, 200, 300], 'yes', 'hi', 'ok']



"""
深拷贝:会连子对象的内存也全部拷贝一份,对子镀锡的修改不会影响源对象

比如: 爷爷 儿子 孙子 都会拷贝 并指向(拷贝一个整体) 
"""







# 列表的案例
"""
有一个员工列表 names = ['张三,'李四','王二麻子','周周'] 
输入一个员工的名字 如果员工存在那么不添加 如果员工不存在则添加员工 
"""
"""
names = ['张三','李四','王二麻子','周周']
name = input("请输入员工姓名")
if name in names:
    print("员工存在")
else:
    names.append(name)
    print("员工不存在，已添加员工")
print(names)
"""

"""
求列表的最大数以及下标
"""
nums = [100,555,66,44,77]
"""
# 下面只是拿到了最大的数，没有拿到索引
num = nums[0] # 拿一个列表的值当作最开始比较的数
for i in nums: 
    if num < i:
        num = i
print(num)
"""
"""
num = nums[0] # 拿一个列表的值当作最开始比较的数
index_ = 0
for i in range(len(nums)):
    if num < nums[i]:
        num = nums[i]
        index_ = i
print(num) # 最大数是num
print(index_) # 索引位置
"""
"""
移除空字符串
"""
"""
words = ['hello','good','','yes','ok','']
for i in words:
    if i:
        pass
    else:
        words.remove(i)
print(words) # ['hello', 'good', 'yes', 'ok']
"""
# 多维列表
a11 = [
["龙小一",18,30000,"武汉"],
["龙小二",19,20000,"武汉"],
["龙小五",20,10000,"武汉"],
]
# print(a11[0][2])
"""
for m in range(len(a11)): # 0 
    for i in range(len(a11)+1): # 4
        print(a11[m][i],end="\t")
    print()
"""
import random
teachers = ['A','B','C','D','E','F','G','H','I','J']
rooms = [[],[],[]]
"""
# print(random.choice(teachers)) # 随机返回列表里的一个值
print(random.choice(rooms)) # 随机返回列表里的一个值
"""
"""
for teacher in teachers:
    room = random.choice(rooms) # 随机抽取一个空的列表
    room.append(teacher) # 把老师放进去
# print(rooms)
for i,room in enumerate(rooms): # enumerate是枚举，如果循环变量只有一个的话，返回的是元组
    # 0
    # 1
    # 2
    # 第一种
    #print("房间%d里一共有%d个老师，分别是：%s"%(i+1,len(room),room))
    print('房间%d里一共有%d个老师_分别是:' % (i+1, len(room)), end=" ")
    # 第二种
    for teacher in room:
        print(teacher,end="\t")
    print()
"""

